Meskipun NumPy dibangun berdasarkan C, beberapa algoritma yang intensif komputasi mengalami dinding vektorisasi. Hal ini terjadi ketika latensi inheren dari sifat dinamis Python melebihi manfaat dari abstraksi tingkat tinggi.
1. Pajak Interpreter dan Pembungkusan
Setiap iterasi dalam loop Python standar melibatkan pemeriksaan tipe dinamis dan penghitungan referensi. Bahkan saat menggunakan skalar NumPy, "pembungkusan" data mentah C ke dalam objek Python menciptakan hambatan besar untuk fungsi seperti $\text{logit}(p) = \log(p/(1-p))$. Penanganan kasus batas di C jauh lebih cepat:
>>> logit(0) -> -inf >>> logit(1) -> inf >>> logit(2) -> nan >>> logit(-2) -> nan
2. Pembengkakan Larik Sementara
Ekspresi NumPy murni menciptakan buffer memori sementara untuk setiap operasi bawah. Memperluas melalui C-API memungkinkan Fusi Kernel, di mana transformasi logit dihitung dalam satu langkah tanpa beban memori tambahan.
3. Ketergantungan Ruang
Operasi yang melibatkan pola akses tetangga, seperti stensil 2D:
$$B(I, J) = A(I, J) + (A(I-1, J) + A(I+1, J) + A(I, J-1) + A(I, J+1)) \cdot 0.5D0 + (A(I-1, J-1) + A(I-1, J+1) + A(I+1, J-1) + A(I+1, J+1)) \cdot 0.25D0$$
sulit diekspresikan secara efisien melalui pemotongan tanpa salinan memori berlebihan. Ekstensi C memungkinkan aritmetika pointer langsung yang selaras dengan cache.